package com.jlcloud.core.xss;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.safety.Safelist;
import com.jlcloud.core.tool.utils.StringPool;
import com.jlcloud.core.tool.utils.StringUtil;

/**
 * XSS工具类
 *
 * @author By: JlCloud <br>
 * @Package: com.jlcloud <br>
 * @CreateTime: 2024-12-03 21:45 <br>
 * @Copyright: 2021 www.jilianjituan.com Inc. All rights reserved. <br>
 * @Caution 注意：本内容仅限于冀联人力集团内部传阅，禁止外泄以及用于其他的商业目的 <br>
 */
public class XssUtil {

	/**
	 * 定义安全的HTML白名单
	 */
	public static final Safelist SAFE_LIST = Safelist.basicWithImages(); // 允许基本的HTML标签和图片

	// 初始化白名单，可以根据需求添加或删除标签和属性
	static {
		// 添加额外的标签和属性
		SAFE_LIST.addTags("span", "div"); // 示例：添加额外的标签
		SAFE_LIST.addAttributes("div", "class"); // 示例：为特定标签添加安全属性
	}

	/**
	 * trim 字符串
	 *
	 * @param text text
	 * @return 清理后的 text
	 */
	public static String trim(String text, boolean trim) {
		return trim ? text.trim() : text;
	}

	/**
	 * 清洁输入字符串，去除所有潜在的XSS攻击
	 *
	 * @param value 输入字符串
	 * @return 清理后的字符串
	 */
	public static String clean(String value) {
		if (StringUtil.isNotBlank(value)) {
			return Jsoup.clean(value, SAFE_LIST);
		}
		return StringPool.EMPTY;
	}

	/**
	 * 清洁输入字符串，去除所有潜在的XSS攻击
	 *
	 * @param value    输入字符串
	 * @param settings 输入设置
	 * @return 清理后的字符串
	 */
	public static String clean(String value, Document.OutputSettings settings) {
		if (StringUtil.isNotBlank(value)) {
			return Jsoup.clean(value, StringPool.EMPTY, SAFE_LIST, settings);
		}
		return StringPool.EMPTY;
	}

	/**
	 * 检查输入字符串是否通过XSS检测
	 *
	 * @param value 输入字符串
	 * @return 是否通过XSS检测
	 */
	public static boolean isPass(String value) {
		if (StringUtil.isBlank(value)) {
			return false;
		}
		// 清洁输入后得到的结果与输入字符串对比
		String cleanedString = Jsoup.clean(value, SAFE_LIST);
		return cleanedString.equals(value);
	}
}
